package 每日一题;

/**
 * 3101. 交替子数组计数
 * 中等
 * 相关标签
 * 相关企业
 * 提示
 * 给你一个
 * 二进制数组
 * nums 。
 *
 * 如果一个
 * 子数组
 * 中 不存在 两个 相邻 元素的值 相同 的情况，我们称这样的子数组为 交替子数组 。
 *
 * 返回数组 nums 中交替子数组的数量。
 *
 *
 *
 * 示例 1：
 *
 * 输入： nums = [0,1,1,1]
 *
 * 输出： 5
 *
 * 解释：
 *
 * 以下子数组是交替子数组：[0] 、[1] 、[1] 、[1] 以及 [0,1] 。
 *
 * 示例 2：
 *
 * 输入： nums = [1,0,1,0]
 *
 * 输出： 10
 *
 * 解释：
 *
 * 数组的每个子数组都是交替子数组。可以统计在内的子数组共有 10 个。
 *
 *
 *
 * 提示：
 *
 * 1 <= nums.length <= 105
 * nums[i] 不是 0 就是 1 。
 */
public class T3101_交替子数组计数 {

    public long countAlternatingSubarrays(int[] nums) {

        //遍历数组 按照最长子数组 进行 分割
        //例如 101001 分割 为 1010 、01  再计算每个子数组的数量
        long result = 0;
        int subArrayLen = 1;
        //记录第一个数
        int left = nums[0];
        //从第二个数开始
        for (int i = 1; i < nums.length; i++) {

            //判断 当前 的数是否与左边的数相等
            if (nums[i] != left) {
                subArrayLen++;
                left = nums[i];
            } else {
                //计算 上一个子数组的数量 并将结果累计
                result += ((long) subArrayLen * subArrayLen + subArrayLen) / 2;
                subArrayLen = 1;
                left = nums[i];
            }

        }
        result += ((long) subArrayLen * subArrayLen + subArrayLen) / 2;

        return result;

    }

    public long countAlternatingSubarrays2(int[] nums) {

        //遍历数组 按照最长子数组 进行 分割
        //例如 101001 分割 为 1010 、01  再计算每个子数组的数量
        long result = 0;
        int subArrayLen = 0;

        //从第二个数开始
        for (int i = 0; i < nums.length; i++) {

            //判断 当前 的数是否与左边的数相等
            if (subArrayLen>0&&nums[i] != nums[i - 1]) {
                subArrayLen++;
            } else {
                subArrayLen = 1;

            }

            result += subArrayLen;

        }
        return result;

    }
}
